package com.smile.frame.workflow.flowable.demo.service;

import org.flowable.engine.runtime.ProcessInstance;

import java.util.Date;
import java.util.Map;

/**
 * 流程实例
 *
 * @author LGC
 */
public interface BpmProcessInstanceService {

    /**
     * 查询流程实例
     *
     * @param tenantId            租户ID
     * @param userId              发起人
     * @param processInstanceName 流程实例名称
     * @param processDefinitionId 流程定义ID
     * @param businessKey         业务key
     * @param category            分类
     * @param status              BpmProcessInstanceStatusEnum
     * @param startTime           实例开始时间
     * @param endTime             实例结束时间
     * @param pageNo              第几页
     * @param pageSize            每页条数
     */
    void queryProcessInstance(String tenantId, String userId, String processInstanceName,
                              String processDefinitionId, String businessKey,
                              String category, Integer status,
                              Date startTime, Date endTime, Integer pageNo, Integer pageSize);


    /**
     * 获得流程实例
     *
     * @param processInstanceId 流程实例的ID
     * @return 流程实例
     */
    ProcessInstance getProcessInstance(String processInstanceId);

    /**
     * 开启流程实例
     *
     * @param tenantId    租户ID
     * @param userId      发起人
     * @param key         流程key
     * @param businessKey 业务key
     * @param variables   流程变量
     * @return
     */
    ProcessInstance startProcessByKey(String tenantId, String userId, String key, String businessKey, Map<String, Object> variables);


    /**
     * 取消流程实例
     * 通过删除流程实例，实现流程实例的取消
     * 删除流程实例，正则执行任务 ACT_RU_TASK. 任务会被删除
     *
     * @param userId            操作人
     * @param processInstanceId 流程实例ID
     * @param reason            取消原因
     */
    void cancelProcessInstance(String userId, String processInstanceId, String reason);


    /**
     * 更新流程实例变量，流程状态为不通过
     * 删除流程实例，正则执行任务 ACT_RU_TASK. 任务会被删除
     * 任务审批不通过时使用
     *
     * @param processInstanceId 流程实例ID
     * @param reason            不通过原因
     */
    void updateProcessInstanceReject(String processInstanceId, String reason);

}
